<?php
/*

	Форм-процессор
	* see http://in.jetstyle.ru/rocket/rocketforms

	Вспомогательный класс.

	FormField( &$form, $field, &$config )
			- $rh              -- ссылка на Form, откуда берёт ссылку на $rh, например
			- $field           -- уникальный идентификатор поля, вида: "subject", "body_r", "author_id"
			- &$config         -- ссылка на конфиг поля. Обязательно ссылка, потому что может попастся
														массив из полей

	-------------------

	// внутренние
	* _BuildComponents() -- строит все нужные компоненты и привязывает их в $this
	* _LinkToForm( &$form ) -- привязка к форме
	* _Dump() -- используется для вывода "содержимого" формы при отладке

	// Общение с формой
	* Parse()                    -- парсинг поля для формы
	* LoadFromPost( $post_data ) -- распознавание своих данных из поста
	* Validate()                 -- валидация текущего поля
	* ToSession/FromSession      -- работа с сессией
	* Db<*> -- набор прослоек для работы с БД

================================================================== v.0 (kuso@npj)
 */

class FormField
{
	var $name=""; // идентификатор поля
	var $default_config = array(
		/* target config, к чему мы стремимся в нашем безумном рефакторинге */
		"model"      => "model_plain",
		"wrapper"    => "wrapper_field",
		"view"       => "view_plain",
		"interface"  => "interface_string",
		"validator"  => "validator_base",
		"event"      => "abstract",
		"filter"     => "abstract",
		/*  ---- а пока -- временный, смешной ---- 
		 "model"      => "_pile_of_junk",
		 "wrapper"    => "_pile_of_junk",
		 "view"       => "_pile_of_junk",
		 "interface"  => "_pile_of_junk",
		 "validator"  => "_pile_of_junk",
		 "event"      => "_pile_of_junk",
		 */
	);

	function FormField( &$form, $field=NULL, &$config )
	{
		$this->form = &$form;
		$this->rh   = &$form->rh;
		$this->tpl_data  = $form->tpl_data;

		if ($field == NULL) $field = $form->_NextInnerName();
		$this->name = $field;

		if (!is_array($config)) $config = $this->default_config;
		else                    Form::StaticDefaults($this->default_config, $config);

		$this->config = &$config;
		$this->_BuildComponents();
	}

	// (внутренняя) строит все нужные компоненты
	var $components= array( "model", "wrapper", "view", "interface", "validator", "event", 'filter' );
	var $components_hash = array();
	function _BuildComponents()
	{
		$this->rh->UseClass( "Form_FormComponents_abstract" );
		foreach( $this->components as $c )
		{
			$c_name = $this->config[$c];
			if (is_object($c_name)) // direct link to existing foreign object
			{
				$c_instance = &$c_name;
				$c_instance->LinkToField( $this );
			} else {
				if (isset($this->components_hash[ $c_name ])) { // link to object in same pack
					$c_instance = &$this->components_hash[ $c_name ];
				} else { // independent object, need to create
					$this->rh->UseClass( "Form_FormComponents_".$c_name );
					eval( '$c_instance = &new FormComponent_'.$c_name.'( $this->config );');
					$c_instance->LinkToField( $this );
					$this->components_hash[ $c_name ] = &$c_instance;
				}
			}
			// $this->{model | wrapper | ... } =& $c_instance
			$this->$c =& $c_instance;
		}
	}

	// привязка к форме
	function _LinkToForm( &$form )
	{
		$this->form = &$form;
		$this->event->Event_Register();
	}

	// парсинг поля формы
	function Parse( $is_readonly=false )
	{
		debug("FormField: Parsing field: { ".$this->name." }");

		if ($is_readonly || 
			(isset($this->config["readonly"]) && $this->config["readonly"]) || 
			(isset($this->form->config["readonly"]) && $this->form->config["readonly"])
		) {
			$result = $this->view->View_Parse();
		} else {
			if (isset($this->config["view_wrap_interface"]) && $this->config["view_wrap_interface"]) {
				$result = $this->view->View_Parse( $this->interface->Interface_Parse() );
			} else {
				$result = $this->interface->Interface_Parse();
			}
		}

		debug("FormField: interface parsed"); 
		$wrapper_parse_rs = $this->wrapper->Wrapper_Parse( $result );

		return $wrapper_parse_rs;
	}

	// распознавание данных из поста
	function LoadFromPost( $post_data )           
	{
		if ($this->config["readonly"]) return;
		return $this->model->Model_LoadFromArray(
			$this->interface->Interface_PostToArray( $post_data )
		);
	}
	function LoadFromArray( $a )           
	{
		if ($this->config["readonly"]) return;
		return $this->model->Model_LoadFromArray( $a );
	}

	// валидация одного поля
	function Validate()
	{
		return $this->validator->Validate();
	}

	function Filtrate()
	{
		return $this->filter->filtrate();
	}

	// сессия
	function ToSession( &$session_storage )
	{
		if ($this->config["readonly"]) return;
		$this->model->Model_ToSession( $session_storage );
	}
	function FromSession( &$session_storage )
	{
		if ($this->config["readonly"]) return;
		$this->model->Model_FromSession( $session_storage );
	}

	// для отладок
	function _Dump()
	{
		return $this->model->Model_Dump();
	}

	// сохранение в БД
	function DbInsert( &$fields, &$values )
	{
		if (!$this->config["db_ignore"])
			return $this->model->Model_DbInsert( $fields, $values );
	}
	function DbAfterInsert( $data_id )
	{
		if (!$this->config["db_ignore"])
			return $this->model->Model_DbAfterInsert( $data_id );
	}
	function DbUpdate( $data_id, &$fields, &$values )
	{
		if (!$this->config["db_ignore"])
			return $this->model->Model_DbUpdate( $data_id, $fields, $values );
	}
	function DbAfterUpdate( $data_id )
	{
		if (!$this->config["db_ignore"])
			return $this->model->Model_DbAfterUpdate( $data_id );
	}
	function DbLoad( $data_id )
	{
		if (!$this->config["db_ignore"])
			return $this->model->Model_DbLoad( $data_id );
	}
	function DbDelete( $data_id )
	{
		if (!$this->config["db_ignore"])
			return $this->model->Model_DbDelete( $data_id );
	}

	// EOC{ FormField }
}


?>
